<?php defined('SYSPATH') or die('No direct script access.');

class Model_ReviewParser_Rozetka extends Model_ReviewParser_Abstract
{
    protected $rozetka_url = 'http://rozetka.com.ua';                           // Урл Розетки =)
    protected $search_url  = 'http://rozetka.com.ua/search/?section=%2F&text='; // Шаблон урла поиска
    protected $model = null;                                                    // Экземпляр модели
    
    public function parse(Model_Model $model, $url = null)
    {
        $this->model = $model;
        
        // По уже составленному списку урлов парсим
        $urls = $model->rozetka_urls;
        if ($urls) {
            $urls = explode("\n", $urls);
            
            // Удаляем дубли страниц с одинаковами отзывами
            $counts = $urls_norepeats = array();
            foreach ($urls as $url) {
                $count = $this->_get_reviews_count($url); 
                if (!isset($counts[$count])) {
                    $urls_norepeats[] = $url;
                    $counts[$count] = 1;    
                }      
            }
            echo $model->id . ' - ' . count($urls) . ' - ' . count($urls_norepeats) . '<br />';
            
            foreach ($urls_norepeats as $url) {
                $url = trim($url);
                $this->reviews_url = $this->_get_reviews_url($url);
                
                while ($page_data = $this->_get_page_data()) {            
                    while ($review_data = $this->_get_review_data($page_data)) {                    
                        $id              = $this->_get_id($review_data);
                        $user_nick       = $this->_get_user_nick($review_data);
                        $date            = $this->_get_date($review_data);
                        $rating          = $this->_get_rating($review_data);
                        $link            = $this->_get_link($review_data);
                        
                        $pluses          = $this->_get_pluses($review_data);
                        $minuses         = $this->_get_minuses($review_data);
                        $text            = $this->_get_text($review_data);
                        $u               = $this->_get_usefulness($review_data);
                        $visible         = $this->_is_useful_review($rating, $u, $pluses, $minuses);
                        
                        try {
                            ORM::factory('review_rozetka')->add_review($this->model, $id, $text, $pluses, $minuses, $rating,
                                $user_nick, $link, $date, $u['yes'], $u['no'], $visible);
                        } catch (Database_Exception $e) {
                            if (strstr($e->getMessage(), 'Duplicate entry') !== false) {
                                continue;
                            }
                            die($e->getMessage());
                        }   
                        
                        //echo 'id - '.$id.'<br />';
                        //echo 'user_nick - '.$user_nick.'<br />'; 
                        //echo 'date - '.date('d-M-y', $date).'<br />'; 
                        //echo 'rating - '.$rating.'<br />';
                        //echo 'link - '.$link.'<br />';  
                        //echo 'pluses - '.$pluses.'<br />'; 
                        //echo 'minuses - '.$minuses.'<br />'; 
                        //echo 'text - '.$text.'<br />'; 
                        //print_r($u);
                        //echo '<hr />';   
                    }
                    //sleep(1);  
                } 
            }
        }      
    }
    
    public function get_reviews_urls($model)
    {
        $urls = array();
        $stop_words = array(
            'питания', 'батарея', 'аккумулятор', 'зарядное', 'накладка', 'пленка',
            'картридж', 'автодержатель', 'кабель', 'чехол',  
        );
        $data = $this->_get_source_code($this->search_url . urlencode($model->name)); 
        while ($product = $this->_cut_str('<td class="detail"', '</td>', $data)) {
            $product = $this->_cut_str('<div class="title">', '</div>', $product);
            $name = $this->_cut_str('>', '</a>', $product);
            $url  = $this->_cut_str('href="', '"', $product); 
            
            // Бьем название по "для" для отсечения аксессуаров
            $parts = explode('для', $name);
            if (count($parts) > 1) {
                continue;
            }
            $clean_name = Model_Main::get_clean_name($name);
            $isset_stop_word = false;
            foreach ($stop_words as $stop_word) {
                if (strstr($clean_name, $stop_word) !== false) {
                    $isset_stop_word = true;
                    break;
                }    
            }
            if ($isset_stop_word) {
                continue;
            }
            
            // Избавляемся от параметров в урле
            // http://hard.rozetka.com.ua/ru/products/details/41014/index.html#oam_source=search;oam_slot=main;oam_row=1;oam_content=title
            $parts = explode('#', $url);
            if (count($parts) > 1) {
                $url = $parts[0];   
            }
            $urls[] = $url;
            echo '<span style="color: red;">' . $name . '</span> - ' . $url . '<br />';
        }                                 
        return $urls;
    } 
    
    protected function _get_reviews_url($url)
    {
        $data = $this->_get_source_code(trim($url));
        if ($url = $this->_cut_str('name="comments"', '</li', $data)) {
            $url = $this->_cut_str(' href="', '"', $url);
            return $url;      
        }     
        return null; 
    }   
    
    protected function _get_reviews_count($url)
    {
        $data = $this->_get_source_code(trim($url));
        if ($tmpCount = $this->_cut_str('name="comments"', '</li', $data)) {
            $count = $this->_cut_str('class="count_comments">', '</span', $tmpCount);
            if (!$count) {
                $count = $this->_cut_str('property="v:count">', '</span', $tmpCount); 
            }
            if ($count) {
                return (int)$count; 
            }     
        }    
        return 0; 
    }  
    
    protected function _get_page_data()
    {
        if (!$this->reviews_url) {
            return null;
        }
        
        $data = $this->_get_source_code($this->reviews_url); 
               
        // пихаем в $this->reviews_url адрес следущей страницы
        $this->reviews_url = $this->_get_next_page_url($data);
        
        return $data;
    }
    
    protected function _get_next_page_url($data)
    {
        if ($url = $this->_cut_str('name="navigation_next"', '</td>', $data)) {
            $url = $this->_cut_str(' href="', '"', $url);
            return $url;      
        }     
        return null;    
    }
    
    protected function _get_review_data(&$data)
    {
        if ($_data = $this->_cut_str('<li class="pp-review-item"', '</li>', $data)) {
            return $_data;    
        }
        return null;
    }
    
    protected function _get_id($data)
    {
        if ($id = $this->_cut_str('name="', '"', $data)) {
            return (int)$id;    
        }
        return null;
    }
    
    protected function _get_user_nick($data)
    {
        if ($nick = $this->_cut_str('class="pp-r-autor">', '</b', $data)) {
            return strip_tags($nick);    
        }
        return null;
    }
    
    protected function _get_date($data)
    {
        $months = array(
            'января'    => '01',
            'февраля'   => '02',
            'марта'     => '03',
            'апреля'    => '04',
            'мая'       => '05',
            'июня'      => '06',
            'июля'      => '07',
            'августа'   => '08',
            'сентября'  => '09',
            'октября'   => '10',
            'ноября'    => '11',
            'декабря'   => '12',
        );
        
        if ($date = $this->_cut_str('class="pp-r-date">', '</span', $data)) {
            $parts = explode(' ', $date);
            $result = array();
            
            if (count($parts) == 3) {
                $result['d'] = $parts[0];
                $result['m'] = $months[$parts[1]];
                $result['y'] = $parts[2];   
            } else {
                return null;
            }
            
            $date = strtotime(implode('-', $result));
            if ($date) {
                return $date;
            }              
        }
        return null;
    }
    
    protected function _get_rating($data)
    {
        $ratings = array(
            '20'  => 1,
            '40'  => 2,
            '60'  => 3,
            '80'  => 4,
            '100' => 5,
        );
        
        if ($rating = $this->_cut_str('class="pp-r-r-value">', '</div', $data)) { 
            if ($rating = $this->_cut_str('<div style="width:', '%">', $rating)) {
                return $ratings[$rating];
            }            
        }
        return 0;   
    }
    
    protected function _get_link($data) {
        if ($link = $this->_cut_str('class="pp-r-head">', '</a', $data)) {
            if ($link = $this->_cut_str('href="', '"', $link)) {
                return $link;   
            }    
        }
        return null;
    }
    
    protected function _get_pluses($data)
    {
        if ($pluses = $this->_cut_str('Плюсы:</b>', '</p', $data)) {
            return trim($pluses);    
        }
        return null;  
    }
    
    protected function _get_minuses($data)
    {
        if ($minuses = $this->_cut_str('Минусы:</b>', '</p', $data)) {
            return trim($minuses);    
        }
        return null;  
    }
    
    protected function _get_text($data)
    {
        if ($text = $this->_cut_str('class="pp-r-text">', '</p', $data)) {
            return trim($text);    
        }
        return null;   
    }
    
    
    protected function _get_usefulness($data)
    {
        $usefulness = array();
        if (!($_data = $this->_cut_str('class="pp-r-vote"', '</div', $data))) {
            return $usefulness;
        }
        $usefulness['yes'] = 0;
        if (($yes = $this->_cut_str('name="positive_block"', '/span', $_data)) !== null) {
            if ($yes = $this->_cut_str('name="count">(', ')<', $yes)) {
                $usefulness['yes'] = (int)$yes;   
            }        
        }
        $usefulness['no'] = 0;
        if (($no = $this->_cut_str('name="negative_block"', '/span', $_data)) !== null) {
            if ($no = $this->_cut_str('name="count">(', ')<', $no)) {
                $usefulness['no'] = (int)$no;   
            }      
        }
        return $usefulness;
    }
    
    protected function _is_useful_review($rating, $u, $pluses, $minuses) {
        if ($rating || $u['yes'] || $pluses || $minuses) {
            return true;
        }
        return false;
    }
}